package com.edu.exam.entity.examination.control;

import com.edu.exam.enums.examination.TimeControlState;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import java.time.LocalDateTime;

/**
 * 时间控制实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：time_control
 *
 * <p>时间控制实体用于管理答题过程中的时间控制，包括总时间、剩余时间、
 * 暂停时间、时间延长等功能。支持精确的时间管理和预警机制。</p>
 *
 * <p>核心功能：
 * - 时间监控：监控答题时间消耗和剩余时间
 * - 暂停管理：管理答题暂停和恢复
 * - 时间延长：支持时间延长申请和批准
 * - 预警机制：提供时间预警和提醒
 * - 时间统计：统计时间使用情况</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Entity
public class TimeControl {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 时间控制ID
     *
     * <p>时间控制的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "time_control_id", nullable = false, length = 32, unique = true)
    private String timeControlId;

    /**
     * 会话ID
     *
     * <p>关联的答题控制会话ID。</p>
     */
    @Column(name = "session_id", nullable = false, length = 32)
    private String sessionId;

    /**
     * 学生ID
     *
     * <p>答题学生的ID。</p>
     */
    @Column(name = "student_id", nullable = false, length = 32)
    private String studentId;

    /**
     * 总允许时间（秒）
     *
     * <p>答题总允许时间（秒）。</p>
     */
    @Column(name = "total_allowed_time", nullable = false)
    private Integer totalAllowedTime;

    /**
     * 剩余时间（秒）
     *
     * <p>剩余答题时间（秒）。</p>
     */
    @Column(name = "remaining_time", nullable = false)
    private Integer remainingTime;

    /**
     * 已用时间（秒）
     *
     * <p>已用答题时间（秒）。</p>
     */
    @Column(name = "time_spent", nullable = false)
    private Integer timeSpent = 0;

    /**
     * 暂停时间（秒）
     *
     * <p>暂停时间（秒）。</p>
     */
    @Column(name = "pause_time", nullable = false)
    private Integer pauseTime = 0;

    /**
     * 延长时间（秒）
     *
     * <p>延长时间（秒）。</p>
     */
    @Column(name = "extension_time", nullable = false)
    private Integer extensionTime = 0;

    /**
     * 控制状态
     *
     * <p>时间控制的状态。
     * 支持的状态：NOT_STARTED（未开始）、RUNNING（运行中）、PAUSED（暂停）、EXTENDED（已延长）、STOPPED（已停止）、EXPIRED（已过期）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "control_state", nullable = false, length = 20)
    private TimeControlState controlState = TimeControlState.NOT_STARTED;

    /**
     * 开始时间
     *
     * <p>计时开始时间。</p>
     */
    @Column(name = "start_time")
    private LocalDateTime startTime;

    /**
     * 结束时间
     *
     * <p>计时结束时间。</p>
     */
    @Column(name = "end_time")
    private LocalDateTime endTime;

    /**
     * 最后暂停时间
     *
     * <p>最后暂停的时间。</p>
     */
    @Column(name = "last_pause_time")
    private LocalDateTime lastPauseTime;

    /**
     * 最后恢复时间
     *
     * <p>最后恢复的时间。</p>
     */
    @Column(name = "last_resume_time")
    private LocalDateTime lastResumeTime;

    /**
     * 时间延长申请
     *
     * <p>JSON格式的时间延长申请记录。</p>
     */
    @Column(name = "extension_requests", columnDefinition = "TEXT")
    private String extensionRequests;

    /**
     * 时间事件
     *
     * <p>JSON格式的时间事件记录。</p>
     */
    @Column(name = "time_events", columnDefinition = "LONGTEXT")
    private String timeEvents;

    /**
     * 时间设置
     *
     * <p>JSON格式的时间设置参数。</p>
     */
    @Column(name = "time_settings", columnDefinition = "TEXT")
    private String timeSettings;

    /**
     * 时间预警
     *
     * <p>JSON格式的时间预警配置。</p>
     */
    @Column(name = "time_alerts", columnDefinition = "TEXT")
    private String timeAlerts;

    /**
     * 时间统计
     *
     * <p>JSON格式的时间统计数据。</p>
     */
    @Column(name = "time_statistics", columnDefinition = "TEXT")
    private String timeStatistics;

    /**
     * 是否允许延长
     *
     * <p>标记是否允许时间延长。</p>
     */
    @Column(name = "allow_extension")
    private Boolean allowExtension = true;

    /**
     * 最大延长次数
     *
     * <p>允许的最大延长次数。</p>
     */
    @Column(name = "max_extension_count")
    private Integer maxExtensionCount = 3;

    /**
     * 已延长次数
     *
     * <p>已延长的次数。</p>
     */
    @Column(name = "extension_count")
    private Integer extensionCount = 0;

    /**
     * 预警阈值（分钟）
     *
     * <p>时间预警的阈值（分钟）。</p>
     */
    @Column(name = "alert_threshold_minutes")
    private Integer alertThresholdMinutes = 5;

    /**
     * 最后预警时间
     *
     * <p>最后发送预警的时间。</p>
     */
    @Column(name = "last_alert_time")
    private LocalDateTime lastAlertTime;

    /**
     * 时间控制备注
     *
     * <p>时间控制的备注信息。</p>
     */
    @Column(name = "time_notes", columnDefinition = "TEXT")
    private String timeNotes;

    /**
     * 时间标签
     *
     * <p>JSON格式的时间标签。</p>
     */
    @Column(name = "time_tags", columnDefinition = "TEXT")
    private String timeTags;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreationTimestamp
    @Column(name = "created_time", nullable = false, updatable = false)
    private LocalDateTime createdTime;

    /**
     * 更新时间
     */
    @UpdateTimestamp
    @Column(name = "updated_time", nullable = false)
    private LocalDateTime updatedTime;

    /**
     * 版本号（乐观锁）
     */
    @Version
    @Column(name = "version")
    private Integer version = 0;

    /**
     * 逻辑删除标记
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;
}